package org.microframework.base.core.security.context;

import org.microframework.base.core.security.model.LoginUser;

/**
 * 安全上下文持有者
 * 
 * 用于存储和获取当前线程的安全上下文
 */
public class SecurityContextHolder {
    
    /**
     * 使用ThreadLocal存储用户信息，确保线程安全
     */
    private static final ThreadLocal<LoginUser> contextHolder = new ThreadLocal<>();
    
    /**
     * 设置当前线程的用户信息
     * 
     * @param user 登录用户信息
     */
    public static void setLoginUser(LoginUser user) {
        contextHolder.set(user);
    }
    
    /**
     * 获取当前线程的用户信息
     * 
     * @return 登录用户信息
     */
    public static LoginUser getLoginUser() {
        return contextHolder.get();
    }
    
    /**
     * 获取当前用户ID
     * 
     * @return 用户ID，如果未登录则返回null
     */
    public static Long getUserId() {
        LoginUser loginUser = getLoginUser();
        return loginUser != null ? loginUser.getUserId() : null;
    }
    
    /**
     * 获取当前用户名
     * 
     * @return 用户名，如果未登录则返回null
     */
    public static String getUsername() {
        LoginUser loginUser = getLoginUser();
        return loginUser != null ? loginUser.getUsername() : null;
    }
    
    /**
     * 判断当前用户是否拥有指定权限
     * 
     * @param permission 权限标识
     * @return 是否拥有权限
     */
    public static boolean hasPermission(String permission) {
        LoginUser loginUser = getLoginUser();
        if (loginUser == null || loginUser.getPermissions() == null) {
            return false;
        }
        
        // 管理员拥有所有权限
        if (loginUser.isAdmin()) {
            return true;
        }
        
        return loginUser.getPermissions().contains(permission);
    }
    
    /**
     * 判断当前用户是否拥有指定角色
     * 
     * @param role 角色标识
     * @return 是否拥有角色
     */
    public static boolean hasRole(String role) {
        LoginUser loginUser = getLoginUser();
        if (loginUser == null || loginUser.getRoles() == null) {
            return false;
        }
        
        // 管理员拥有所有角色
        if (loginUser.isAdmin()) {
            return true;
        }
        
        return loginUser.getRoles().contains(role);
    }
    
    /**
     * 清除当前线程的用户信息
     */
    public static void clear() {
        contextHolder.remove();
    }
} 